x

Сокрытие

Краткие правила были описаны в Наследование, сейчас будут примеры

Сокрытие поля

class Base {
    protected int protField = 3;
    public int pubField = 4;
    public static int statField = 5;
}

class Extended extends Base {
    protected float protField = 7.0f;
    public float pubField = 8.0f;
    public static int statField = 9;

    print(this.protField) // 7.0
    print(super.protField) // 3
    print(this.pubField) // 8
    print(super.pubField) // 4
    print(statField) // 9
    print(Base.statFiel) // 5
}

Если имя поля в подклассе и в суперклассе одинаковое

  • Поле подкласса скрывает поле суперкласса
  • Статическое поле суперкласса доступно по имени класса BaseClass.staticField
  • Нестатическое поле суперкласса доступно с помощью super: super.instanceField
  • Скрытое поле может иметь другой тип
  • Поле может стать static, если было не статик. И наоборот

Сокрытие метода

Только для статиков

class Base {
    public int getVal() {
        return 1;
    }
    public static int statVal() {
        return 3;
    }
}

class Ext extends Base {
    public int getVal() {
        return 2;
    }
    public static int statVal() {
        return 4;
    }
}

Base b = new Base();
Ext e = new Ext();
Base be = new Ext();

print(b.statVal()) // 3
print(e.statVal()) // 4
print(be.statVal()) // 3 - по типу ссылки для статики

print(b.getVal()) // 1
print(e.getVal()) // 2
print(be.getVal()) // 2 - просто переопределение

Если сигнатура (имя и параметры) статического метода в подклассе и в суперклассе одинаковая

  • Статический метод подкласса скрывает метод суперкласса
  • Статический метод суперкласса доступен по имени класса BaseClass.staticMethod()
  • Модификатор доступа может только расшириться (правило как в переопределении)
  • Возвращаемое значение должно быть ковариантным (тоже как в переопределении)
  • Менять статик на нон-статик и обратно запрещено

P.S.

Сокрытие методов в целом плохая практика, обращаться к статике по объектам - плохой тон

Left-click: follow link, Right-click: select node, Scroll: zoom
x